package cn.ecommerce.course.module.users.utils;

import org.springframework.stereotype.Component;

import java.util.regex.Pattern;

/**
 * 邮箱校验工具类
 */
@Component
public final class EmailValidationUtils {

    // 基础邮箱正则：常见格式，适合一般业务场景
    private static final Pattern EMAIL_BASIC_PATTERN = Pattern.compile(
            "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$",
            Pattern.CASE_INSENSITIVE
    );

    // 更严格的邮箱正则：限制长度，域名标签不能以连字符开头/结尾，不允许连续点等
    // 参考常见实践，接近 RFC 规范，但不覆盖所有极端情况
    private static final Pattern EMAIL_STRICT_PATTERN = Pattern.compile(
            "^(?=.{1,254}$)(?=.{1,64}@)[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@" +
            "(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)\\.)+[A-Za-z]{2,}$",
            Pattern.CASE_INSENSITIVE
    );

    private EmailValidationUtils() {
        // 工具类不允许实例化
    }

    /**
     * 基础校验：校验常见邮箱格式
     *
     * @param email 邮箱字符串
     * @return true 合法；false 不合法
     */
    public static boolean isValidEmail(String email) {
        if (email == null) {
            return false;
        }
        String normalized = normalize(email);
        return EMAIL_BASIC_PATTERN.matcher(normalized).matches();
    }

    /**
     * 严格校验：更接近 RFC 的约束，限制长度与域名标签规则
     *
     * @param email 邮箱字符串
     * @return true 合法；false 不合法
     */
    public static boolean isValidEmailStrict(String email) {
        if (email == null) {
            return false;
        }
        String normalized = normalize(email);
        return EMAIL_STRICT_PATTERN.matcher(normalized).matches();
    }

    /**
     * 规范化邮箱：去除首尾空格，统一为小写
     *
     * @param email 原始邮箱
     * @return 规范化后的邮箱；若为 null 则返回 null
     */
    public static String normalize(String email) {
        if (email == null) {
            return null;
        }
        return email.trim().toLowerCase();
    }
}